package com.sky.command;



/**
 * @author : wushikai
 * <p>
 * date : 2020-08-19
 * 命令模式结构
 * 抽象命令类（Command）角色：声明执行命令的接口，拥有执行命令的抽象方法 execute()。
 * 具体命令角色（Concrete    Command）角色：是抽象命令类的具体实现类，它拥有接收者对象，并通过调用接收者的功能来完成命令要执行的操作。
 * 实现者/接收者（Receiver）角色：执行命令功能的相关操作，是具体命令对象业务的真正实现者。
 * 调用者/请求者（Invoker）角色：是请求的发送者，它通常拥有很多的命令对象，并通过访问命令对象来执行相关请求，它不直接访问接收者。
 */
 abstract class Command {


    public abstract void execute();
}

/**
 * 调用者
 */
class Invoker {

    private Command command;

    public Invoker(Command command) {
        this.command = command;
    }


    public void setCommand(Command command) {
        this.command = command;
    }

    public void call() {

        System.out.println("调用者执行命令command");
        command.execute();
    }

}


/**
 * 具体命令
 */
class ConcreteCommand extends Command {
    public ConcreteCommand() {
        receiver = new Receiver();
    }

    private Receiver receiver;

    public ConcreteCommand(Receiver receiver) {
        receiver = new Receiver();
        this.receiver = receiver;
    }

    @Override
    public void execute() {

        receiver.action();
    }
}


/**
 * 接收者
 */
class Receiver {

    public void action() {

        System.out.println("接收者的action()方法被调用");
    }
}


class Client{

    public static void main(String[] args){
        Command cmd = new ConcreteCommand();
        Invoker invoker = new Invoker(cmd);
        invoker.call();

    }

}








